package com.puboot.common.util;
import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.List;

/**
 * 化工
 * Created by chen on 2021/10/16.
 */
public class GasDCUtil {


    /**
     * 计算温室气体排放总量 EGHG
     *
     * @param eco2Burn           企业边界内化石燃料燃烧产生的CO2 排放 ECO2_燃烧
     * @param eghgProcess        企业边界内工业生产过程产生的各种温室气体CO2当量排放  EGHG_过程
     * @param eghgRecovery       企业回收且外供的CO2量 EGHG_回收
     * @param eghgNetElectricity 企业净购入的电力消费引起的CO2排放 EGHG_净电
     * @param eghgNetHeat        企业净购入的热力消费引起的CO2排放 EGHG_净热
     * @return EGHG
     */
        public static Double getTotalGreenhouseGasEmissions(Double eco2Burn, Double eghgProcess, Double eghgRecovery, Double eghgNetElectricity, Double eghgNetHeat) {
        return allAdd(eco2Burn, eghgProcess, eghgRecovery, eghgNetElectricity, eghgNetHeat).doubleValue();
    }

    /**
     * 计算温室气体排放总量 EGHG
     *
     * @param eco2Burn        ECO2_燃烧
     * @param eco2RawMaterial ECO2_原料
     * @param eco2Nitrate     ECO2_碳酸盐
     * @param en2oNitricAcid  EN2O_硝酸
     * @param en2oAdipicAcid  EN2O_己二酸
     * @param q               Q
     * @param purCo2          PURCO2
     * @param adPower         AD电力
     * @param efPower         EF电力
     * @param adHeat          AD热力
     * @param efHeat          EF热力
     * @return ECO2_燃烧 + ECO2_原料 + ECO2_碳酸盐 + (EN2O_硝酸 + EN2O_己二酸) * 310 - Q * PURCO2 * 197.7 + AD电力 * EF电力 + AD热力 * EF热力
     */
    public static Double getTotalGreenhouseGasEmissions(Double eco2Burn, Double eco2RawMaterial, Double eco2Nitrate,
                                                 Double en2oNitricAcid, Double en2oAdipicAcid, Double q,
                                                 Double purCo2, Double adPower, Double efPower,
                                                 Double adHeat, Double efHeat) {
        BigDecimal en2oNitricAcidB = new BigDecimal(Double.toString(en2oNitricAcid));
        BigDecimal en2oAdipicAcidB = new BigDecimal(Double.toString(en2oAdipicAcid));
        BigDecimal adPowerB = new BigDecimal(Double.toString(adPower));
        BigDecimal efPowerB = new BigDecimal(Double.toString(efPower));
        BigDecimal adHeatB = new BigDecimal(Double.toString(adHeat));
        BigDecimal efHeatB = new BigDecimal(Double.toString(efHeat));
        BigDecimal cp_1 = en2oNitricAcidB.add(en2oAdipicAcidB);
        BigDecimal cl310B = new BigDecimal(Double.toString(310));
        BigDecimal cp_2 = cp_1.multiply(cl310B);
        BigDecimal cp_3 = allAdd(eco2Burn, eco2RawMaterial, eco2Nitrate);
        BigDecimal cp_4 = cp_2.add(cp_3);
        BigDecimal cp_5 = allMul(q, purCo2, 197.7);
        BigDecimal cp_6 = cp_4.subtract(cp_5);
        BigDecimal cp_7 = adPowerB.multiply(efPowerB);
        BigDecimal cp_8 = adHeatB.multiply(efHeatB);
        BigDecimal cp_9 = allAdd(cp_6.doubleValue(), cp_7.doubleValue(), cp_8.doubleValue());

//        Double cp_1 = Arith.add(en2oNitricAcid, en2oAdipicAcid);
//        Double cp_2 = Arith.mul(cp_1, 310);
//        Double cp_3 = allAdd(eco2Burn, eco2RawMaterial, eco2Nitrate);
//        Double cp_4 = Arith.add(cp_2, cp_3);
//        Double cp_5 = allMul(q, purCo2, 197.7);
//        Double cp_6 = Arith.sub(cp_4, cp_5);
//        Double cp_7 = Arith.mul(adPower, efPower);
//        Double cp_8 = Arith.mul(adHeat, efHeat);
//        Double cp_9 = allAdd(cp_6, cp_7, cp_8);
        return cp_9.doubleValue();
    }

    /**
     * 计算企业边界内化石燃料燃烧产生的CO2 排放 ECO2_燃烧
     *
     * @param adis
     * @param ccis
     * @param ofis
     * @return ECO2_燃烧
     */
    public static BigDecimal getEco2Burn(List<String> adis, List<String> ccis, List<String> ofis) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < adis.size(); i++) {
            BigDecimal cp_1 = getADiAndCCiAndOFiResult(adis.get(i), ccis.get(i), ofis.get(i));
            result = result.add(cp_1);
        }
        return result;
    }


    /**
     * 计算企业边界内化石燃料燃烧产生的CO2 排放 ECO2_燃烧
     *
     * @param adis
     * @param ofis
     * @param ncvis
     * @param efis
     * @return
     */
    public static BigDecimal getEco2Burn(List<String> adis, List<String> ofis, List<String> ncvis, List<String> efis) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < adis.size(); i++) {
            BigDecimal cp_1 = getAdiAndOfiAndNcviAndEfiResult(Double.valueOf(adis.get(i)), Double.valueOf(ofis.get(i)), Double.valueOf(ncvis.get(i)), Double.valueOf(efis.get(i)));
            result = result.add(cp_1);
        }
        return result;
    }

    /**
     * 获取ECO2 单行结果
     *
     * @param adi
     * @param ofi
     * @param ncvi
     * @param efi
     * @return
     */
    public static BigDecimal getAdiAndOfiAndNcviAndEfiResult(Double adi, Double ofi, Double ncvi, Double efi) {
        BigDecimal b1 = new BigDecimal(Double.toString(ncvi));
        BigDecimal b2 = new BigDecimal(Double.toString(efi));
        BigDecimal cp_1 = b1.multiply(b2);
        BigDecimal cp_2 = allMul(adi, cp_1.doubleValue(), ofi, 44.0);
        BigDecimal cl12B = new BigDecimal(Double.toString(12));
        return cp_2.divide(cl12B, 10, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 获取ECO2 单行结果
     *
     * @param adi
     * @param cci
     * @param ofi
     * @return
     */
    public static BigDecimal getADiAndCCiAndOFiResult(String adi, String cci, String ofi) {
        BigDecimal cp_1 = allMul(Double.valueOf(adi), Double.valueOf(cci), Double.valueOf(ofi), 44.0);
        BigDecimal cl12B = new BigDecimal(Double.toString(12));
        return cp_1.divide(cl12B, 10, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算ECO2_原料
     *
     * @param adrs
     * @param ccrs
     * @param adps
     * @param ccps
     * @param adws
     * @param ccws
     * @return
     */
    public static BigDecimal getEco2RawMaterialByAdrAndCcrAndAdpAndCcpAndAdwAndCcw(List<String> adrs, List<String> ccrs, List<String> adps,
                                                                        List<String> ccps, List<String> adws, List<String> ccws) {
        BigDecimal cp_1 = getAdrAndCcrResult(adrs, ccrs);
        BigDecimal cp_2 = getAdrAndCcrResult(adps, ccps);
        BigDecimal cp_3 = getAdrAndCcrResult(adws, ccws);
        BigDecimal cp_4 = cp_2.add(cp_3);
        BigDecimal cp_5 = cp_1.subtract(cp_4);
        BigDecimal b1 = new BigDecimal(Double.toString(44.0));
        BigDecimal cp_6 = cp_5.multiply(b1);
        BigDecimal cl12B = new BigDecimal(Double.toString(12));
        return cp_6.divide(cl12B, 10, BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 计算ECO2_碳酸盐
     *
     * @param adis
     * @param efis
     * @param pupi
     * @return
     */
    public static BigDecimal getEco2CarbonateByAdiAndEfiAndPuri(List<String> adis, List<String> efis, List<String> pupi) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < adis.size(); i++) {
            BigDecimal cp_1 = allMul(Double.valueOf(adis.get(i)), Double.valueOf(efis.get(i)), Double.valueOf(pupi.get(i)));
            result = result.add(cp_1);
        }
        return result;
    }

    /**
     * 计算EN2O_硝酸
     *
     * @param adjs
     * @param efjs
     * @param nscrs
     * @param others
     * @return
     */
    public static BigDecimal getEn2oNitricAcidByAdjAndEfjAndNscrAndOther(List<String> adjs, List<String> efjs, List<String> nscrs, List<String> others) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < adjs.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(nscrs.get(i));
            BigDecimal cp_2B = new BigDecimal(others.get(i));
            BigDecimal cl1B = new BigDecimal(1);
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            BigDecimal cp_4B = cl1B.subtract(cp_3B);
            BigDecimal adjsB = allMul(Double.valueOf(adjs.get(i)), Double.valueOf(efjs.get(i)), cp_4B.doubleValue(), 0.001);
            result = result.add(adjsB);
        }
        return result;
    }

    /**
     * 计算EN2O_己二酸
     * @param adjs
     * @param efjs
     * @param nscrs
     * @param others
     * @return
     */
    public static BigDecimal getEn2oAdipicAcidByAdjAndEfjAndNscrAndOther(List<String> adjs, List<String> efjs, List<String> nscrs, List<String> others){
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < adjs.size(); i++) {
            BigDecimal cp_1B = new BigDecimal(nscrs.get(i));
            BigDecimal cp_2B = new BigDecimal(others.get(i));
            BigDecimal cl1B = new BigDecimal(1);
            BigDecimal cp_3B = cp_1B.multiply(cp_2B);
            BigDecimal cp_4B = cl1B.subtract(cp_3B);
            BigDecimal adjsB = allMul(Double.valueOf(adjs.get(i)), Double.valueOf(efjs.get(i)), cp_4B.doubleValue(), 0.001);
            result = result.add(adjsB);
        }
        return result;
    }

    /**
     * 获取两个相同位数集合的乘积之和
     *
     * @param vals1
     * @param vals2
     * @return
     */
    public static BigDecimal getAdrAndCcrResult(List<String> vals1, List<String> vals2) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (int i = 0; i < vals1.size(); i++) {
            BigDecimal vals1B = new BigDecimal(vals1.get(i));
            BigDecimal vals2B = new BigDecimal(vals2.get(i));
            BigDecimal vals3B = vals1B.multiply(vals2B);
            result = result.add(vals3B);
        }
        return result;
    }

    /**
     * 计算所有参数的和
     *
     * @param vals
     * @return
     */
    public static BigDecimal allAdd(Double... vals) {
        BigDecimal result = new BigDecimal(Double.toString(0.0));
        for (Double val : vals) {
            BigDecimal valB = new BigDecimal(Double.toString(val));
            result = result.add(valB);
        }
        return result;
    }

    /**
     * 计算所有参数的乘积
     *
     * @param vals
     * @return
     */
    public static BigDecimal allMul(Double... vals) {
        BigDecimal result = new BigDecimal(Double.toString(1.0));
        for (Double val : vals) {
            BigDecimal valB = new BigDecimal(Double.toString(val));
            result = result.multiply(valB);
        }
        return result;
    }

    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal divisor = new BigDecimal("1");
        return b.divide(divisor, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 生产千分位结果
     * @param result
     * @return
     */
    public static String getThousandth(Double result){
        DecimalFormat df = new DecimalFormat(",###,##0"); //保留整数
        return df.format(result);
    }


    public static void main(String[] args) {
//        List<String> adis = Arrays.asList("0.56".split(","));
//        List<String> ccis = Arrays.asList("0.11".split(","));
//        List<String> ofis = Arrays.asList("0.98".split(","));
//        Double eco2Burn = getEco2Burn(adis, ccis, ofis);
//        Double cp_1 = Arith.add(0.02, 0.03);
//        Double cp_2 = Arith.mul(cp_1, 310);
//        Double cp_3 = allAdd(eco2Burn, 0.5852, 0.4397);
//        Double cp_4 = Arith.add(cp_2, cp_3);
//        Double cp_5 = allMul(0.02, 0.98, 197.7);
//        Double cp_6 = Arith.sub(cp_4, cp_5);
//        Double cp_7 = Arith.mul(1.53, 0.26);
//        Double cp_8 = Arith.mul(0.9419, 0.11);
//        Double cp_9 = allAdd(cp_6, cp_7, cp_8);
//        System.out.println(eco2Burn);
//        System.out.println(cp_4);// 16.7449
//
//        System.out.println(cp_5);//3.87492
//        System.out.println(cp_6);//0.3978
//        System.out.println(cp_7);//0.103609
//        System.out.println(cp_8);
//        System.out.println(cp_9);
    }
}
